"""
break和continue语句
学习目标：
1. 掌握break语句的使用（跳出循环）
2. 掌握continue语句的使用（跳过本次循环）
3. 理解break和continue的区别
4. 学会在实际场景中应用
"""

# ==================== 1. break语句 - 跳出循环 ====================
print("=" * 50)
print("1. break - 跳出整个循环")
print("=" * 50)

print("找到第一个能被7整除的数：")
for i in range(1, 100):
    if i % 7 == 0:
        print(f"  找到了：{i}")
        break  # 找到后立即跳出循环
    print(f"  检查：{i}")

print("循环结束")

print("\n💡 break的作用：")
print("  - 立即终止循环")
print("  - 跳出当前循环，继续执行循环后的代码")
print("  - 常用于找到目标后提前退出")

print()

# ==================== 2. continue语句 - 跳过本次循环 ====================
print("=" * 50)
print("2. continue - 跳过本次循环")
print("=" * 50)

print("打印1-10中的奇数：")
for i in range(1, 11):
    if i % 2 == 0:
        continue  # 偶数时跳过，不执行后面的print
    print(f"  {i}")

print("\n💡 continue的作用：")
print("  - 跳过本次循环剩余部分")
print("  - 直接进入下一次循环")
print("  - 常用于过滤不需要的数据")

print()

# ==================== 3. break vs continue ====================
print("=" * 50)
print("3. break 和 continue 的区别")
print("=" * 50)

print("使用break（遇到5就停止）：")
for i in range(1, 11):
    if i == 5:
        print(f"  遇到{i}，使用break")
        break
    print(f"  {i}")
print("  循环结束\n")

print("使用continue（跳过5）：")
for i in range(1, 11):
    if i == 5:
        print(f"  遇到{i}，使用continue，跳过")
        continue
    print(f"  {i}")
print("  循环结束")

print()

# ==================== 4. 实战：查找元素 ====================
print("=" * 50)
print("4. 实战：在列表中查找元素")
print("=" * 50)

fruits = ["apple", "banana", "orange", "grape", "mango"]
target = "orange"

print(f"水果列表：{fruits}")
print(f"查找目标：{target}")
print()

found = False
for fruit in fruits:
    print(f"  检查：{fruit}")
    if fruit == target:
        print(f"  ✅ 找到了：{fruit}")
        found = True
        break

if not found:
    print(f"  ❌ 未找到：{target}")

print()

# ==================== 5. 实战：过滤数据 ====================
print("=" * 50)
print("5. 实战：过滤列表（跳过负数）")
print("=" * 50)

numbers = [10, -5, 20, -3, 30, -8, 40]
print(f"原列表：{numbers}")
print("\n处理正数：")

total = 0
for num in numbers:
    if num < 0:
        print(f"  跳过负数：{num}")
        continue
    print(f"  处理正数：{num}")
    total += num

print(f"\n正数总和：{total}")

print()

# ==================== 6. 实战：验证密码 ====================
print("=" * 50)
print("6. 实战：密码验证（3次机会）")
print("=" * 50)

correct_password = "python123"
max_attempts = 3

# 模拟用户输入
passwords = ["123456", "abc123", "python123"]

print(f"请输入密码（最多{max_attempts}次机会）：")

for attempt in range(1, max_attempts + 1):
    password = passwords[attempt - 1]
    print(f"\n第{attempt}次尝试：输入 {'*' * len(password)}")
    
    if password == correct_password:
        print("✅ 密码正确！登录成功")
        break
    else:
        remaining = max_attempts - attempt
        if remaining > 0:
            print(f"❌ 密码错误，还有{remaining}次机会")
        else:
            print("❌ 密码错误，账户已锁定")

print()

# ==================== 7. 实战：跳过特定值 ====================
print("=" * 50)
print("7. 实战：打印星期（跳过周末）")
print("=" * 50)

days = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]

print("工作日：")
for day in days:
    if day in ["周六", "周日"]:
        continue  # 跳过周末
    print(f"  {day}")

print()

# ==================== 8. 实战：提前退出多重条件 ====================
print("=" * 50)
print("8. 实战：查找质数")
print("=" * 50)

def is_prime(n):
    """判断是否为质数"""
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False  # 找到因数，不是质数
    return True

print("100以内的前10个质数：")
count = 0
for num in range(2, 100):
    if is_prime(num):
        print(f"  {num}", end=" ")
        count += 1
        if count >= 10:
            break  # 找到10个就停止

print()
print()

# ==================== 9. 实战：跳过空值 ====================
print("=" * 50)
print("9. 实战：处理数据（跳过空值）")
print("=" * 50)

data = ["张三", None, "李四", "", "王五", None, "赵六"]
print(f"原数据：{data}")
print("\n有效数据：")

valid_count = 0
for item in data:
    if item is None or item == "":
        continue  # 跳过空值
    print(f"  {item}")
    valid_count += 1

print(f"\n有效数据数量：{valid_count}")

print()

# ==================== 10. 实战：成绩统计（跳过无效成绩） ====================
print("=" * 50)
print("10. 实战：成绩统计（跳过无效成绩）")
print("=" * 50)

scores = [85, -1, 92, 150, 78, -5, 88, 95]
print(f"原成绩列表：{scores}")
print("\n处理过程：")

valid_scores = []
for score in scores:
    if score < 0 or score > 100:
        print(f"  跳过无效成绩：{score}")
        continue
    valid_scores.append(score)
    print(f"  有效成绩：{score}")

if valid_scores:
    average = sum(valid_scores) / len(valid_scores)
    print(f"\n有效成绩：{valid_scores}")
    print(f"平均分：{average:.2f}")

print()

# ==================== 11. 实战：菜单系统 ====================
print("=" * 50)
print("11. 实战：菜单系统（break退出）")
print("=" * 50)

# 模拟用户选择
choices = ["1", "2", "5", "3", "3"]
choice_index = 0

while True:
    print("\n===== 主菜单 =====")
    print("1. 新建文件")
    print("2. 打开文件")
    print("3. 退出")
    print("==================")
    
    if choice_index < len(choices):
        choice = choices[choice_index]
    else:
        choice = "3"
    choice_index += 1
    
    print(f"选择：{choice}")
    
    if choice == "1":
        print("→ 新建文件...")
    elif choice == "2":
        print("→ 打开文件...")
    elif choice == "3":
        print("→ 退出程序")
        break  # 退出循环
    else:
        print("→ 无效选择，请重新选择")
        continue  # 跳过后面的代码，重新显示菜单

print()

# ==================== 12. 实战：嵌套循环中的break ====================
print("=" * 50)
print("12. break在嵌套循环中（只跳出当前循环）")
print("=" * 50)

print("查找第一个两位数完全平方数：")
for i in range(1, 100):
    square = i ** 2
    if square >= 10 and square < 100:
        print(f"  {i}² = {square}")
        break  # 只跳出for循环

print("外层代码继续执行")

print()

# ==================== 13. 实战：读取数据直到遇到标记 ====================
print("=" * 50)
print("13. 实战：读取数据直到遇到结束标记")
print("=" * 50)

data_stream = [10, 20, 30, -999, 40, 50]  # -999是结束标记
print(f"数据流：{data_stream}")
print("\n读取数据：")

total = 0
for data in data_stream:
    if data == -999:
        print("  遇到结束标记，停止读取")
        break
    print(f"  读取：{data}")
    total += data

print(f"\n累计值：{total}")

print()

# ==================== 14. 实战：跳过特定范围 ====================
print("=" * 50)
print("14. 实战：打印数字（跳过10-20）")
print("=" * 50)

print("1-30的数字（跳过10-20）：")
for i in range(1, 31):
    if 10 <= i <= 20:
        continue  # 跳过10-20
    print(f"  {i}", end=" ")
    if i % 10 == 0:  # 每10个换行
        print()

print()
print()

# ==================== 15. 实战：查找多个目标 ====================
print("=" * 50)
print("15. 实战：查找列表中的所有特定元素")
print("=" * 50)

numbers = [1, 5, 3, 5, 7, 5, 9, 5, 2]
target = 5

print(f"列表：{numbers}")
print(f"查找目标：{target}")
print("\n查找结果：")

positions = []
for i, num in enumerate(numbers):
    if num != target:
        continue  # 不是目标，跳过
    positions.append(i)
    print(f"  位置{i}：{num}")

print(f"\n找到{len(positions)}个，位置：{positions}")

print()

# ==================== 16. while循环中的break和continue ====================
print("=" * 50)
print("16. while循环中的break和continue")
print("=" * 50)

print("示例：跳过5的倍数，遇到30停止")
i = 1
while i <= 50:
    if i == 30:
        print(f"  遇到{i}，break停止")
        break
    
    if i % 5 == 0:
        print(f"  跳过{i}（5的倍数）")
        i += 1
        continue
    
    print(f"  {i}")
    i += 1

print()

# ==================== 17. 实战：输入验证 ====================
print("=" * 50)
print("17. 实战：输入验证（continue重新输入）")
print("=" * 50)

# 模拟输入序列
inputs = ["abc", "-5", "0", "150", "85"]
input_index = 0

print("请输入成绩（0-100）：")

while input_index < len(inputs):
    score_str = inputs[input_index]
    input_index += 1
    
    print(f"\n输入：{score_str}")
    
    # 检查是否为数字
    if not score_str.isdigit():
        print("  ❌ 请输入数字")
        continue
    
    score = int(score_str)
    
    # 检查范围
    if score < 0 or score > 100:
        print(f"  ❌ 分数必须在0-100之间")
        continue
    
    # 验证通过
    print(f"  ✅ 有效成绩：{score}")
    break

print()

# ==================== 18. pass语句（占位符） ====================
print("=" * 50)
print("18. pass语句（空操作占位符）")
print("=" * 50)

print("pass用于语法占位，不执行任何操作")
print("\n示例：")

for i in range(5):
    if i == 2:
        pass  # 暂时不处理，占位
    else:
        print(f"  {i}")

print("\n💡 pass的用途：")
print("  - 语法占位符")
print("  - 用于还未实现的代码块")
print("  - 保持代码结构完整")

print()

# ==================== 总结 ====================
print("=" * 50)
print("✨ break和continue总结")
print("=" * 50)
print("""
1. break语句：
   - 立即终止整个循环
   - 跳出循环，执行循环后的代码
   - 常用于：找到目标、错误退出、菜单退出

   for i in range(10):
       if i == 5:
           break  # 遇到5就停止循环
       print(i)

2. continue语句：
   - 跳过本次循环剩余部分
   - 直接进入下一次循环
   - 常用于：过滤数据、跳过特定值

   for i in range(10):
       if i % 2 == 0:
           continue  # 跳过偶数
       print(i)

3. pass语句：
   - 空操作，什么都不做
   - 用于语法占位
   - 代码结构完整但功能未实现时使用

4. 使用场景：
   break：
   ✅ 查找第一个匹配项
   ✅ 验证失败立即退出
   ✅ 菜单退出选项
   ✅ 达到某个条件停止

   continue：
   ✅ 过滤无效数据
   ✅ 跳过特定值
   ✅ 输入验证失败重新输入
   ✅ 条件不满足跳过处理

5. 注意事项：
   ⚠️ break只跳出当前循环（嵌套循环注意）
   ⚠️ continue后的代码不会执行
   ⚠️ while循环用continue时注意更新循环变量
   ⚠️ 不要过度使用，影响代码可读性

6. 最佳实践：
   - 清晰的退出条件
   - 适当的注释说明
   - 避免多层嵌套中频繁使用
   - 考虑是否可以用其他方式实现
""")
print("=" * 50)

